package com.windchime.blog.controller.admin;


import com.github.pagehelper.PageInfo;
import com.windchime.blog.entity.Blog;
import com.windchime.blog.entity.Type;
import com.windchime.blog.entity.vo.TypeOrTagVo;
import com.windchime.blog.entity.vo.TypeSearch;
import com.windchime.blog.result.R;
import com.windchime.blog.service.BlogService;
import com.windchime.blog.service.TypeService;
import com.windchime.blog.utils.StringSplitUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;


/**
 * <p>
 * 分类表 前端控制器
 * </p>
 *
 * @author WindChime
 * @since 2021-08-01
 */
@RestController
@RequestMapping("/admin/type")
public class AdminTypeController {

    @Autowired
    private TypeService typeService;

    @Autowired
    private BlogService blogService;

    /**
     * 分页查询带条件
     * @param page 当前页
     * @param limit 当前页条目数
     * @param typeSearch 条件
     * @return tags
     */
    @GetMapping("/selectTypeList")
    public R selectTypeList(Integer page, Integer limit, TypeSearch typeSearch) {
        PageInfo<Type> types = typeService.selectTypeList(page, limit, typeSearch);
        return R.ok().code(0).msg("").count(types.getTotal()).data("types", types.getList());
    }

    /**
     * 查询所有分类--给博客添加和修改页面使用
     * @return types
     */
    @PostMapping("/selectAll")
    public R selectAll() {
        List<Type> types = typeService.list();
        List<TypeOrTagVo> typeOrTagVos = types.stream().map(type -> new TypeOrTagVo(type.getName(), type.getId())).collect(Collectors.toList());
        return R.ok().data("types", typeOrTagVos);
    }

    /**
     * 通过博客ID获取到该博客有什么分类
     * @param id 博客ID
     * @return typeSelect
     */
    @GetMapping("/selectChecked/{id}")
    public R selectChecked(@PathVariable Long id) {
        Blog blog = blogService.getById(id);
        Type type = typeService.getById(blog.getTypeId());
        List<TypeOrTagVo> typeOrTagVos = new ArrayList<>();
        typeOrTagVos.add(new TypeOrTagVo(type.getName(), type.getId()));
        return R.ok().data("typeSelect", typeOrTagVos);
    }

    /**
     * 保存分类
     * @param type 分类
     * @return true
     */
    @PostMapping("/saveType")
    public R saveType(Type type) {
        boolean b = typeService.saveType(type);
        if (b) {
            return R.ok().msg("添加成功");
        } else {
            return R.error().msg("已有该分类,请重新输入分类名");
        }
    }

    /**
     * 修改分类
     * @param type 分类
     * @return true
     */
    @PostMapping("/editType")
    public R editType(Type type) {
        boolean b = typeService.editType(type);
        if (b) {
            return R.ok().msg("修改成功");
        } else {
            return R.error().msg("分类名已被使用,请重新修改");
        }
    }

    /**
     * 删除分类
     * @param id 分类ID
     * @return true
     */
    @GetMapping("/deleteType/{id}")
    public R deleteType(@PathVariable Long id) {
        boolean b = typeService.removeById(id);
        if (b) {
            return R.ok().msg("删除成功");
        } else {
            return R.error().msg("删除失败");
        }
    }

    /**
     * 批量删除
     * @param ids ids数组字符串
     * @return true
     */
    @GetMapping("/deleteTypes/{ids}")
    public R deleteType(@PathVariable String ids) {
        List<Long> idList = StringSplitUtil.split(ids, ",");
        boolean b = typeService.removeByIds(idList);
        if (b) {
            return R.ok().msg("批量删除成功");
        } else {
            return R.error().msg("批量删除失败");
        }
    }

}

